package rpc.corder;

import hassion.Hession;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @author Jim
 * @date 16:34 2022/5/6
 * @description
 * @email:huwmz04153277@126.com
 */
public class MyObjectDecoder extends ByteToMessageDecoder {

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf byteBuf, List<Object> list) throws Exception {
        /**
         * 解决粘包，半包问题
         */
        //读取消息头,整个消息的长度字段
        if (byteBuf.readableBytes() < 4) {
            return;
        }

        byteBuf.markReaderIndex();
        int dataLength = byteBuf.readInt();//读取一个规定的int，即长度
        if (dataLength < 0) {
            ctx.close();
        }
        //读取字节数组,直到读取的字节数组长度等于dataLength
        if (byteBuf.readableBytes() < dataLength) {
            byteBuf.resetReaderIndex();
            return;
        }


//        ByteBuf in2 = byteBuf.retainedDuplicate();
//        byte[] dst;
//        if (in2.hasArray()) {//堆缓冲区模式
//            dst = in2.array();
//        } else {
//            dst = new byte[in2.readableBytes()];
//            in2.getBytes(in2.readerIndex(), dst);
//        }
        byte[] dst = new byte[dataLength];
        byteBuf.readBytes(dst);
        //      byteBuf.skipBytes(byteBuf.readableBytes());
        Object obj = Hession.hessionDeserizlize(dst);
        list.add(obj);

    }
}
